/*
 * Copyright (C), 2002-2015, 苏宁易购电子商务有限公司
 * FileName: SnBookPackageUpdateUtil.java
 * Author:   14111222
 * Date:     2015-9-22 上午9:36:01
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.suning.snbook.updatetool;

import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 〈一句话功能简述〉<br> 
 * 〈功能详细描述〉
 *
 * @author 14111222
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class SnBookPackageUpdateUtil {
    
    private static Logger logger = Logger.getLogger(SnBookPackageUpdateUtil.class.getName());
    
    //有传入包的地址为空
    private final static int PACKAGE_ADDRESS_EMPTY = 1;
    
    //无效地址
    private final static int INVALID_ADDRESS = 2;
    
    //新包路径无效
    private final static int NEW_PACKAGE_INVALID_ADDRESS = 3;
    
    //其他异常
    private final static int OTHER_INVALID = 4;
    
    //补丁包非有效路径
    private final static int PATCH_PACKAGE_INVALID_ADDRESS = 5;
    
    //windows下调用异常
    private final static int WINDOWS_EXEC_EXCEPTION= 6;
    
    //老包地址无效
    private final static int OLD_PACKAGE_INVALID_ADDRESS = 7;
    
    
    /**
     * 
     * 功能描述: 获取android增量升级的 增量包<br>
     * 〈功能详细描述〉linux 下
     *
     * @param oldPackage 原始包
     * @param newPackage    新包
     * @param patchPackage  补丁包]
     * 
     * @return  0:生成增量包成功,  1:有传入包的地址为空 2:无效路径 3:新包路径无效 4:其他异常 5:补丁包非有效路径 6:window下调用异常 7:老包地址无效
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int getPatch(String oldPackage, String newPackage, String patchPackage) {
        return getPatch(oldPackage, newPackage, patchPackage, "");
    }
    
    /**
     * 
     * 功能描述: 获取android增量升级的 增量包<br>
     * 〈功能详细描述〉windows下
     *
     * @param oldPackage 原始包
     * @param newPackage    新包
     * @param patchPackage  补丁包]
     * @param execPatch  比较包工具路径
     * 
     * @return  0:生成增量包成功,  1:有传入包的地址为空 2:无效路径 3:新包路径无效 4:其他异常 5:补丁包非有效路径 6:window下调用异常 7:老包地址无效
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int getPatch(String oldPackage, String newPackage, String patchPackage, String execPatch) {
        try {
            if(isEmpty(oldPackage) || isEmpty(newPackage)) {
                return PACKAGE_ADDRESS_EMPTY;
            }
            if (!oldPackage.toLowerCase().endsWith("apk") || !newPackage.toLowerCase().endsWith("apk") || !patchPackage.toLowerCase().endsWith("patch")) {
                return INVALID_ADDRESS;
            }
            File oldPackageFile = new File(oldPackage);
            File newPackageFile = new File(newPackage);
            if (!oldPackageFile.exists() || !oldPackageFile.isFile()) {
                return OLD_PACKAGE_INVALID_ADDRESS;
            }
            if (!newPackageFile.exists() || !newPackageFile.isFile()) {
                return NEW_PACKAGE_INVALID_ADDRESS;
            }
            File patchPackagePath = new File(patchPackage.substring(0,patchPackage.lastIndexOf(File.separator)));
            if (!patchPackagePath.exists() || !patchPackagePath.isDirectory()) {
                return PATCH_PACKAGE_INVALID_ADDRESS;
            }
        } catch (Exception e) {
            logger.setLevel(Level.WARNING);
            logger.warning("==生成增量包地址信息异常===" + e);
            return OTHER_INVALID;
        }
        if (isWindows()) {
            Runtime rt = Runtime.getRuntime();    
            try {    
                    rt.exec(execPatch + " " + oldPackage + " " + newPackage + " " + patchPackage );   
                    return 0;
            } catch (Exception e) {   
                    logger.setLevel(Level.WARNING);
                    logger.warning("==windows下调用异常===" + e);
                    return WINDOWS_EXEC_EXCEPTION;
            }  
        }
        return BSDUtil.diff(oldPackage, newPackage, patchPackage);
    }
    
    /**
     * 
     * 功能描述: 合并补丁包<br>
     * 〈功能详细描述〉linux 下
     *
     * @param oldPackage 原始包
     * @param newPackage    合并生成后的包
     * @param patchPackage  增量包
     *                              
     * @return  0:生成增量包成功,  1:有传入包的地址为空 2:无效路径 3:新包路径无效 4:其他异常 5:补丁包非有效路径 6:window下调用异常 7:老包地址无效
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int mergePatch(String oldPackage, String newPackage, String patchPackage) {
        return mergePatch(oldPackage, newPackage, patchPackage, "");
    }
    
    /**
     * 
     * 功能描述: 合并补丁包<br>
     * 〈功能详细描述〉windows 下
     *
     * @param oldPackage 原始包
     * @param newPackage    合并生成后的包
     * @param patchPackage  增量包
     * @param execPatch 合并包工具路径
     *                              
     * @return  0:生成增量包成功,  1:有传入包的地址为空 2:无效路径 3:新包路径无效 4:其他异常 5:补丁包非有效路径 6:window下调用异常 7:老包地址无效
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int mergePatch(String oldPackage, String newPackage, String patchPackage, String execPatch) {
        try {
            if(isEmpty(oldPackage) || isEmpty(patchPackage)) {
                return PACKAGE_ADDRESS_EMPTY;
            }
            if (!oldPackage.toLowerCase().endsWith("apk") || !newPackage.toLowerCase().endsWith("apk") || !patchPackage.toLowerCase().endsWith("patch")) {
                return INVALID_ADDRESS;
            }
            File oldPackageFile = new File(oldPackage);
            File patchPackageFile = new File(patchPackage);
            if (!oldPackageFile.exists() || !oldPackageFile.isFile()) {
                return OLD_PACKAGE_INVALID_ADDRESS;
            }
            if (!patchPackageFile.exists() || !patchPackageFile.isFile()) {
                return PATCH_PACKAGE_INVALID_ADDRESS;
            }
            File newPackagePath = new File(newPackage.substring(0,newPackage.lastIndexOf(File.separator)));
            if (!newPackagePath.exists() || !newPackagePath.isDirectory()) {
                return NEW_PACKAGE_INVALID_ADDRESS;
            }
        } catch (Exception e) {
            logger.setLevel(Level.WARNING);
            logger.warning("==合并增量包地址信息异常===" + e);
            return OTHER_INVALID;
        }
        if (isWindows()) {
            Runtime rt = Runtime.getRuntime();    
            try {    
                    rt.exec(execPatch + " " + oldPackage + " " + newPackage + " " + patchPackage );   
                    return 0;
            } catch (Exception e) {   
                    logger.setLevel(Level.WARNING);
                    logger.warning("==windows下调用异常===" + e);
                    return WINDOWS_EXEC_EXCEPTION;
            }  
        }
        return BSDUtil.patch(oldPackage, newPackage, patchPackage);
    }
    
    private static boolean isEmpty(String str){  
        return null ==str || "".equals(str) ? true :false;  
    } 
    
    /*
     * 判断系统类型 true: linux  false:windows
     */
    private static boolean isWindows(){  
        String os = System.getProperty("os.name");  
        if(os.toLowerCase().startsWith("win")){  
            return true; 
        }
        return false;
    }   
}
